home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / andy.lha / Robot.s < prev    next >
Text File  |  1995-09-15  |  14KB  |  932 lines

  1. ROBFRAME: dc.w 0
  2.  
  3. ItsARobot:
  4.  
  5. *******************************
  6. ; cmp.b #4,numlives(a0)
  7. ; blt.s .oklives
  8. ; move.b #4,numlives(a0)
  9. ;.oklives
  10. *******************************
  11.  
  12.  tst.b NASTY
  13.  bne .yesnas
  14.  move.w #-1,12(a0)
  15.  rts
  16. .yesnas:
  17.  
  18.  move.w Facing(a0),d0
  19.  sub.w #2048,d0
  20.  and.w #8190,d0
  21.  move.w d0,Facing(a0)
  22.  
  23.  move.w #100,d0
  24.  jsr FindCloseRoom
  25.  clr.b exitfirst
  26.  
  27.  sub.b #1,worry(a0)
  28.  
  29.  move.w #160,extlen
  30.  move.b #2,awayfromwall
  31.  
  32.  move.l #20*256,StepUpVal
  33.  move.l #160*128,thingheight
  34.  move.l #20*256,StepDownVal
  35.  
  36.  move.w 12(a0),d2
  37.  bge.s .stillalive
  38. .notthisone:
  39.  rts
  40. .stillalive:
  41.  
  42.  tst.b numlives(a0)
  43.  bgt.s .notdying
  44.  
  45.  move.b #0,numlives(a0)
  46.  
  47. .onfloordead:
  48.  move.b #-1,16(a0)
  49.  rts
  50.  
  51. .notdying: 
  52.  
  53. ;
  54. ; movem.l d0-d7/a0-a6,-(a7)
  55. ;
  56. ; move.w (a0),d0
  57. ; move.l #ObjRotated,a1
  58. ; move.l (a1,d0.w*8),Noisex
  59. ; move.w #400,Noisevol
  60. ; move.w #7,Samplenum
  61. ; move.b #1,chanpick
  62. ; move.b 1(a0),IDNUM
  63. ; clr.b notifplaying
  64. ; jsr MakeSomeNoise
  65. ; movem.l (a7)+,d0-d7/a0-a6
  66. ;
  67. ;.nosound:
  68.  
  69.  move.w #10,maxspd(a0)
  70.  
  71.  move.w ROBFRAME,d0
  72.  add.w TempFrames,d0
  73.  cmp.w #43,d0
  74.  blt.s .noresanim
  75.  moveq #0,d0
  76. .noresanim:
  77.  move.w d0,ROBFRAME
  78.  asr.w #1,d0
  79.  move.w d0,10(a0)
  80.  
  81.  move.w #70,nasheight
  82.  
  83.  tst.b 17(a0)
  84.  beq.s .cantseeplayer
  85.   
  86.  tst.w ThirdTimer(a0)
  87.  ble ROBAttack_Player
  88.  move.w TempFrames,d0
  89.  sub.w d0,ThirdTimer(a0)
  90.  bge .waitandsee
  91.  move.w #0,ThirdTimer(a0)
  92.  bra .waitandsee
  93.  
  94. .cantseeplayer 
  95.  
  96.  jsr GetRand
  97.  lsr.w #4,d0
  98.  and.w #63,d0
  99.  add.w #20,d0
  100.  move.w d0,ThirdTimer(a0)
  101.  
  102. .waitandsee:
  103.  
  104.  move.w #30,FourthTimer(a0)
  105.  
  106.  move.l ZoneAdds,a5
  107.  move.l (a5,d2.w*4),d0
  108.  add.l LEVELDATA,d0
  109.  move.l d0,objroom
  110.  
  111.  move.w TempFrames,d0
  112.  sub.w d0,ObjTimer(a0)
  113.  bgt.s .nonewdir
  114.  
  115.  tst.b 17(a0)
  116.  beq.s .keepwandering
  117.  
  118.  bra ROBAttack_Player
  119.  
  120. .keepwandering
  121.  
  122.  jsr GetRand
  123.  and.w #8190,d0
  124.  move.w d0,CurrCPt(a0)
  125.  
  126.  jsr GetRand
  127.  and.w #63,d0
  128.  add.w #100,d0
  129.  move.w d0,ObjTimer(a0)
  130.  
  131. .nonewdir
  132.  
  133.  move.w CurrCPt(a0),d3
  134.  move.l #SineTable,a2
  135.  add.w d3,a2
  136.  move.w (a2),d2
  137.  move.w 2048(a2),d1
  138.  
  139.  move.w Facing(a0),d3
  140.  move.l #SineTable,a2
  141.  move.w 120(a2),d6
  142.  swap d6
  143.  clr.w d6
  144.  asr.l #1,d6
  145.  lea (a2,d3.w),a2
  146.  move.w (a2),d4    ; sin
  147.  move.w 2048(a2),d5 ; cos
  148.  muls d2,d5
  149.  muls d1,d4
  150.  
  151.  moveq #0,d3
  152.  
  153.  sub.l d5,d4
  154.  blt.s .turnrighty
  155. .turnlefty:
  156.  
  157.  cmp.l d4,d6
  158.  bgt.s .doneturn
  159.  
  160.  move.w #-120,d3
  161.  
  162.  bra.s .doneturn
  163. .turnrighty:
  164.  
  165.  neg.l d4
  166.  cmp.l d4,d6
  167.  bgt.s .doneturn
  168.  
  169.  move.w #120,d3
  170.  
  171. .doneturn:
  172.  
  173.  
  174.  muls 2048(a2),d1
  175.  muls (a2),d2
  176.  add.l d2,d1
  177.  cmp.l #$20000000,d1
  178.  bgt.s .canwalk
  179.  move.w #0,maxspd(a0)
  180.  
  181.  add.w d3,d3
  182.  bne.s .canwalk
  183.  move.w #240,d3
  184.  
  185. .canwalk:
  186.  
  187.  add.w Facing(a0),d3
  188.  
  189.  and.w #8191,d3
  190.  
  191.  move.w d3,Facing(a0)
  192.  
  193.  move.w (a0),d1
  194.  move.l ObjectPoints,a1
  195.  lea (a1,d1.w*8),a1
  196.  move.w (a1),oldx 
  197.  move.w 4(a1),oldz
  198.  
  199.  move.w maxspd(a0),d2
  200.  muls TempFrames,d2
  201.  move.w d2,speed
  202.  move.w #300,Range
  203.  
  204.  move.w 4(a0),d0
  205.  ext.l d0
  206.  asl.l #7,d0
  207.  sub.w #40*128,d0
  208.  move.l d0,newy
  209.  move.l d0,oldy
  210.  
  211.  move.b ObjInTop(a0),StoodInTop
  212.  
  213.  movem.l a6/d0/a0/a1/a3/a4/d7,-(a7)
  214.  clr.b canshove
  215.  move.w Facing(a0),d0
  216.  jsr GoInDirection
  217.  move.w #%1000000000,wallflags
  218.  clr.b wallbounce
  219.  Jsr MoveObject
  220.  movem.l (a7)+,a6/d0/a0/a1/a3/a4/d7
  221.  
  222.  move.b StoodInTop,ObjInTop(a0)
  223.  
  224.  tst.b hitwall
  225.  beq.s .nochangedir
  226.  move.w #-1,ObjTimer(a0)
  227. .nochangedir:
  228.  
  229.  move.l objroom,a2
  230.  move.w (a2),d0
  231.  move.w d0,12(a0)
  232.  move.l #ZoneBrightTable,a5
  233.  move.l (a5,d0.w*4),d0
  234.  tst.b ObjInTop(a0)
  235.  bne.s .okbit
  236.  swap d0
  237. .okbit:
  238.  sub.w #5,d0
  239.  move.w d0,2(a0)
  240.  
  241.  move.w newx,(a1)
  242.  move.w newz,4(a1)
  243.  
  244.  move.l ToZoneFloor(a2),d0
  245.  tst.b ObjInTop(a0)
  246.  beq.s .notintop
  247.  move.l ToUpperFloor(a2),d0
  248. .notintop:
  249.  asr.l #7,d0
  250.  sub.w #120,d0
  251.  move.w d0,4(a0)
  252.  
  253.  moveq #0,d2
  254.  move.b damagetaken(a0),d2
  255.  asr.b #4,d2
  256.  beq .noscream
  257.  
  258.  sub.b d2,numlives(a0)
  259.  bgt.s .notdeadyet
  260.  
  261.  movem.l d0-d7/a0-a6,-(a7)
  262.  sub.l ObjectPoints,a1
  263.  add.l #ObjRotated,a1
  264.  move.l (a1),Noisex
  265.  move.w #400,Noisevol
  266.  move.w #15,Samplenum
  267.  move.b #1,chanpick
  268.  clr.b notifplaying
  269.  st backbeat
  270.  move.b 1(a0),IDNUM
  271.  jsr MakeSomeNoise
  272.  
  273.  move.w #120,d0
  274.  bsr ComputeBlast
  275.  
  276.  movem.l (a7)+,d0-d7/a0-a6
  277.  
  278.  move.b #4,16(a0)
  279.  move.b #%1000,17(a0)
  280.  move.l #$50003,8(a0)
  281.  move.w #$2020,6(a0)
  282.  move.w #$1010,14(a0)
  283.  
  284.  
  285.  rts
  286.  
  287. .notdeadyet:
  288.  clr.b damagetaken(a0)
  289.  
  290.  movem.l d0-d7/a0-a6,-(a7)
  291.  sub.l ObjectPoints,a1
  292.  add.l #ObjRotated,a1
  293.  move.l (a1),Noisex
  294.  move.w #200,Noisevol
  295.  move.w #8,Samplenum
  296.  move.b #1,chanpick
  297.  clr.b notifplaying
  298.  move.b 1(a0),IDNUM
  299.  st backbeat
  300.  jsr MakeSomeNoise
  301.  movem.l (a7)+,d0-d7/a0-a6
  302.  
  303. .noscream
  304.  
  305.  move.b ObjInTop(a0),ViewerTop
  306.  move.b PLR1_StoodInTop,TargetTop
  307.  move.l PLR1_Roompt,ToRoom
  308.  move.l objroom,FromRoom
  309.  move.w newx,Viewerx
  310.  move.w newz,Viewerz
  311.  move.b ObjInTop(a0),ViewerTop
  312.  move.b PLR1_StoodInTop,TargetTop
  313.  move.w PLR1_xoff,Targetx
  314.  move.w PLR1_zoff,Targetz
  315.  
  316.  move.l PLR1_yoff,d0
  317.  asr.l #7,d0
  318.  move.w d0,Targety
  319.  
  320.  move.w 4(a0),Viewery
  321.  
  322.  move.w Facing(a0),Facedir
  323.  jsr CanItBeSeen
  324.  
  325.  tst.b CanSee
  326.  beq .carryonprowling
  327.  
  328.  move.b #1,17(a0)
  329.  
  330. .carryonprowling:
  331.  
  332.  move.b ObjInTop(a0),ViewerTop
  333.  move.b PLR2_StoodInTop,TargetTop
  334.  move.l PLR2_Roompt,ToRoom
  335.  move.l objroom,FromRoom
  336.  move.w newx,Viewerx
  337.  move.w newz,Viewerz
  338.  move.w p2_xoff,Targetx
  339.  move.w p2_zoff,Targetz
  340.  move.b ObjInTop(a0),ViewerTop
  341.  move.b PLR2_StoodInTop,TargetTop
  342.  move.l p2_yoff,d0
  343.  asr.l #7,d0
  344.  move.w d0,Targety
  345.  move.w 4(a0),Viewery
  346.  jsr CanItBeSeen
  347.  
  348.  tst.b CanSee
  349.  beq .carryonprowling2
  350.  
  351.  or.b #2,17(a0)
  352.  
  353. .carryonprowling2:
  354.  
  355.  move.w Facing(a0),d0
  356.  add.w #2048,d0
  357.  and.w #8190,d0
  358.  move.w d0,Facing(a0)
  359.  
  360.  
  361. .thisonedead:
  362.  rts
  363.  
  364. p_xoff: dc.l 0
  365. p_zoff: dc.l 0
  366. p_yoff: dc.l 0
  367. p_Roompt: dc.l 0
  368.  
  369. ROBAttack_Player:
  370.  
  371.  move.w TempFrames,d0
  372.  sub.w d0,FourthTimer(a0)
  373.  
  374.  btst #0,17(a0)
  375.  beq MUSTPLR2
  376.  btst #1,17(a0)
  377.  bne.s COULDBE
  378.  
  379.  bra MUSTPLR1
  380.  
  381. COULDBE:
  382.  move.l ObjectPoints,a1
  383.  move.w (a0),d0
  384.  move.w (a1,d0.w*8),d1
  385.  move.w 4(a1,d0.w*8),d2
  386.  
  387.  move.w PLR1_xoff,d3
  388.  move.w PLR1_zoff,d4
  389.  
  390.  sub.w d1,d3
  391.  sub.w d2,d4
  392.  
  393.  muls d3,d3
  394.  muls d4,d4
  395.  add.l d4,d3
  396.  move.w PLR2_xoff,d4
  397.  move.w PLR2_zoff,d5
  398.  sub.w d1,d4
  399.  sub.w d2,d5
  400.  muls d4,d4
  401.  muls d5,d5
  402.  add.l d5,d4
  403.  cmp.l d3,d4
  404.  ble MUSTPLR2
  405.  
  406. MUSTPLR1:
  407.  
  408.  move.w 12(a0),d2
  409.  move.l ZoneAdds,a5
  410.  move.l (a5,d2.w*4),d0
  411.  add.l LEVELDATA,d0
  412.  move.l d0,objroom
  413.  
  414.  move.w PLR1_xoff,newx
  415.  move.w PLR1_zoff,newz
  416.  move.w (a0),d1
  417.  move.l #ObjRotated,a6
  418.  move.l ObjectPoints,a1
  419.  lea (a1,d1.w*8),a1
  420.  lea (a6,d1.w*8),a6
  421.  move.w (a1),oldx
  422.  move.w 4(a1),oldz
  423.  move.w maxspd(a0),d2
  424.  muls.w TempFrames,d2
  425.  move.w d2,speed
  426.  move.w #300,Range
  427.  move.w 4(a0),d0
  428.  ext.l d0
  429.  asl.l #7,d0
  430.  sub.l #40*128,d0
  431.  move.l d0,newy
  432.  move.l d0,oldy
  433.  
  434.  move.b ObjInTop(a0),StoodInTop
  435.  movem.l a6/d0/a0/a1/a3/a4/d7,-(a7)
  436.  clr.b canshove
  437.  clr.b GotThere
  438.  jsr HeadTowardsAng
  439.  move.w #%1000000000,wallflags
  440.  clr.b wallbounce
  441.  Jsr MoveObject
  442.  movem.l (a7)+,a6/d0/a0/a1/a3/a4/d7
  443.  move.b StoodInTop,ObjInTop(a0)
  444.  
  445.  move.w CosRet,d1
  446.  move.w SinRet,d2
  447.  move.w Facing(a0),d3
  448.  move.l #SineTable,a2
  449.  move.w 120(a2),d6
  450.  swap d6
  451.  clr.w d6
  452.  asr.l #1,d6
  453.  lea (a2,d3.w),a2
  454.  move.w (a2),d4    ; sin
  455.  move.w 2048(a2),d5 ; cos
  456.  muls d2,d5
  457.  muls d1,d4
  458.  
  459.  moveq #0,d3
  460.  
  461.  sub.l d5,d4
  462.  blt.s .turnrighty2
  463. .turnlefty2:
  464.  
  465.  cmp.l d4,d6
  466.  bgt.s .doneturn2
  467.  
  468.  move.w #-240,d3
  469.  
  470.  bra.s .doneturn2
  471. .turnrighty2:
  472.  
  473.  neg.l d4
  474.  cmp.l d4,d6
  475.  bgt.s .doneturn2
  476.  
  477.  move.w #240,d3
  478.  
  479. .doneturn2:
  480.  
  481.  move.w #4,maxspd(a0)
  482.  
  483.  muls 2048(a2),d1
  484.  muls (a2),d2
  485.  add.l d2,d1
  486.  cmp.l #$20000000,d1
  487.  sgt.s canshootgun
  488.  bgt.s .canwalk2
  489.  move.w #0,maxspd(a0)
  490.  
  491.  add.w d3,d3
  492.  bne.s .canwalk2
  493.  move.w #480,d3
  494.  
  495. .canwalk2:
  496.  
  497.  add.w Facing(a0),d3
  498.  
  499.  and.w #8191,d3
  500.  
  501.  move.w d3,Facing(a0)
  502.  
  503.  
  504.  move.l objroom,a2
  505.  move.w (a2),d0
  506.  move.w d0,12(a0)
  507.  move.l #ZoneBrightTable,a5
  508.  move.l (a5,d0.w*4),d0
  509.  tst.b ObjInTop(a0)
  510.  bne.s .okbit2
  511.  swap d0
  512. .okbit2:
  513.  sub.w #5,d0
  514.  move.w d0,2(a0)
  515.  
  516.  move.w newx,(a1)
  517.  move.w newz,4(a1)
  518.  
  519.  move.l ToZoneFloor(a2),d0
  520.  tst.b ObjInTop(a0)
  521.  beq.s .notintop2
  522.  move.l ToUpperFloor(a2),d0
  523. .notintop2:
  524.  asr.l #7,d0
  525.  sub.w #120,d0
  526.  move.w d0,4(a0)
  527.  
  528.  move.b damagetaken(a0),d2
  529.  asr.b #4,d2
  530.  beq .noscream2
  531.  
  532.  sub.b d2,numlives(a0)
  533.  bgt.s .notdeadyet2
  534.  
  535.  movem.l d0-d7/a0-a6,-(a7)
  536.  sub.l ObjectPoints,a1
  537.  add.l #ObjRotated,a1
  538.  move.l (a1),Noisex
  539.  move.w #400,Noisevol
  540.  move.w #15,Samplenum
  541.  move.b #1,chanpick
  542.  clr.b notifplaying
  543.  st backbeat
  544.  move.b 1(a0),IDNUM
  545.  jsr MakeSomeNoise
  546.  
  547.  move.w #400,d0
  548.  bsr ComputeBlast
  549.  
  550.  movem.l (a7)+,d0-d7/a0-a6
  551.  
  552.  move.b #4,16(a0)
  553.  move.b #%1000,17(a0)
  554.  move.l #$50003,8(a0)
  555.  move.w #$2020,6(a0)
  556.  move.w #$1010,14(a0)
  557.  
  558.  
  559.  rts 
  560.  
  561. .notdeadyet2:
  562.  clr.b damagetaken(a0)
  563.  
  564.  movem.l d0-d7/a0-a6,-(a7)
  565.  move.l (a6),Noisex
  566.  move.w #200,Noisevol
  567.  move.w #8,Samplenum
  568.  move.b #1,chanpick
  569.  clr.b notifplaying
  570.  st backbeat
  571.  move.b 1(a0),IDNUM
  572.  jsr MakeSomeNoise
  573.  movem.l (a7)+,d0-d7/a0-a6
  574.  
  575.  bra .cantshoot
  576.  
  577. .noscream2:
  578.  
  579.  tst.b canshootgun
  580.  beq .cantshoot
  581.  
  582.  cmp.w #20,FourthTimer(a0)
  583.  bge .cantshoot
  584.  
  585.  move.w #50,FourthTimer(a0)
  586.  
  587.  move.w ThirdTimer(a0),d0
  588.  sub.w #1,d0
  589.  cmp.w #-1,d0
  590.  bge.s .noreset
  591.  
  592.  jsr GetRand
  593.  lsr.w #4,d0
  594.  and.w #127,d0
  595.  add.w #150,d0
  596.  
  597. .noreset:
  598.  move.w d0,ThirdTimer(a0)
  599.  
  600.  move.w #9,Samplenum
  601.  move.b #4,SHOTTYPE
  602.  move.b #10,SHOTPOWER
  603.  move.w #16,SHOTSPEED
  604.  move.w #3,SHOTSHIFT
  605.  move.w #0,SHOTOFFMULT
  606.  move.l #0*128,SHOTYOFF
  607.  move.w #-100,2(a0)
  608.  
  609.  jsr FireAtPlayer1
  610.  
  611. .cantshoot:
  612.  
  613.  move.b #0,17(a0)
  614.  
  615.  move.l PLR1_Roompt,ToRoom
  616.  move.l objroom,FromRoom
  617.  move.w newx,Viewerx
  618.  move.w newz,Viewerz
  619.  move.w p1_xoff,Targetx
  620.  move.w p1_zoff,Targetz
  621.  move.b ObjInTop(a0),ViewerTop
  622.  move.b PLR1_StoodInTop,TargetTop
  623.  move.w Facing(a0),Facedir
  624.  move.l p1_yoff,d0
  625.  asr.l #7,d0
  626.  move.w d0,Targety
  627.  
  628.  move.w 4(a0),Viewery
  629.  
  630.  jsr CanItBeSeen
  631.  
  632.  tst.b CanSee
  633.  beq .carryonattack
  634.  
  635.  move.b #1,17(a0)
  636.  
  637. .carryonattack:
  638.  
  639.  move.l PLR2_Roompt,ToRoom
  640.  move.l objroom,FromRoom
  641.  move.w newx,Viewerx
  642.  move.w newz,Viewerz
  643.  move.w p2_xoff,Targetx
  644.  move.w p2_zoff,Targetz
  645.  move.w Facing(a0),Facedir
  646.  move.b ObjInTop(a0),ViewerTop
  647.  move.b PLR2_StoodInTop,TargetTop
  648.  move.l p2_yoff,d0
  649.  asr.l #7,d0
  650.  move.w d0,Targety
  651.  
  652.  move.w 4(a0),Viewery
  653.  
  654.  jsr CanItBeSeen
  655.  
  656.  tst.b CanSee
  657.  beq .carryonattack2
  658.  
  659.  or.b #2,17(a0)
  660.  
  661. .carryonattack2:
  662.  move.w Facing(a0),d0
  663.  add.w #2048,d0
  664.  and.w #8190,d0
  665.  move.w d0,Facing(a0)
  666.  
  667.  rts
  668.  
  669. MUSTPLR2:
  670.  
  671.  move.w 12(a0),d2
  672.  move.l ZoneAdds,a5
  673.  move.l (a5,d2.w*4),d0
  674.  add.l LEVELDATA,d0
  675.  move.l d0,objroom
  676.  
  677.  move.w PLR2_xoff,newx
  678.  move.w PLR2_zoff,newz
  679.  move.w (a0),d1
  680.  move.l #ObjRotated,a6
  681.  move.l ObjectPoints,a1
  682.  lea (a1,d1.w*8),a1
  683.  lea (a6,d1.w*8),a6
  684.  move.w (a1),oldx
  685.  move.w 4(a1),oldz
  686.  move.w maxspd(a0),d2
  687.  muls.w TempFrames,d2
  688.  move.w d2,speed
  689.  move.w #300,Range
  690.  move.w 4(a0),d0
  691.  ext.l d0
  692.  asl.l #7,d0
  693.  sub.l #80*128,d0
  694.  move.l d0,newy
  695.  move.l d0,oldy
  696.  
  697.  move.b ObjInTop(a0),StoodInTop
  698.  movem.l a6/d0/a0/a1/a3/a4/d7,-(a7)
  699.  clr.b canshove
  700.  clr.b GotThere
  701.  jsr HeadTowardsAng
  702.  move.w #%1000000000,wallflags
  703.  clr.b wallbounce
  704.  Jsr MoveObject
  705.  movem.l (a7)+,a6/d0/a0/a1/a3/a4/d7
  706.  move.b StoodInTop,ObjInTop(a0)
  707.  
  708.  move.w CosRet,d1
  709.  move.w SinRet,d2
  710.  move.w Facing(a0),d3
  711.  move.l #SineTable,a2
  712.  move.w 120(a2),d6
  713.  swap d6
  714.  clr.w d6
  715.  asr.l #1,d6
  716.  lea (a2,d3.w),a2
  717.  move.w (a2),d4    ; sin
  718.  move.w 2048(a2),d5 ; cos
  719.  muls d2,d5
  720.  muls d1,d4
  721.  
  722.  moveq #0,d3
  723.  
  724.  sub.l d5,d4
  725.  blt.s .turnrighty2
  726. .turnlefty2:
  727.  
  728.  cmp.l d4,d6
  729.  bgt.s .doneturn2
  730.  
  731.  move.w #-120,d3
  732.  
  733.  bra.s .doneturn2
  734. .turnrighty2:
  735.  
  736.  neg.l d4
  737.  cmp.l d4,d6
  738.  bgt.s .doneturn2
  739.  
  740.  move.w #120,d3
  741.  
  742. .doneturn2:
  743.  
  744.  move.w #4,maxspd(a0)
  745.  
  746.  muls 2048(a2),d1
  747.  muls (a2),d2
  748.  add.l d2,d1
  749.  cmp.l #$20000000,d1
  750.  sgt.s canshootgun
  751.  bgt.s .canwalk2
  752.  move.w #0,maxspd(a0)
  753.  
  754.  add.w d3,d3
  755.  bne.s .canwalk2
  756.  move.w #240,d3
  757.  
  758. .canwalk2:
  759.  
  760.  add.w Facing(a0),d3
  761.  
  762.  and.w #8191,d3
  763.  
  764.  move.w d3,Facing(a0)
  765.  
  766.  
  767.  move.l objroom,a2
  768.  move.w (a2),d0
  769.  move.w d0,12(a0)
  770.  move.l #ZoneBrightTable,a5
  771.  move.l (a5,d0.w*4),d0
  772.  tst.b ObjInTop(a0)
  773.  bne.s .okbit2
  774.  swap d0
  775. .okbit2:
  776.  sub.w #5,d0
  777.  move.w d0,2(a0)
  778.  
  779.  move.w newx,(a1)
  780.  move.w newz,4(a1)
  781.  
  782.  move.l ToZoneFloor(a2),d0
  783.  tst.b ObjInTop(a0)
  784.  beq.s .notintop2
  785.  move.l ToUpperFloor(a2),d0
  786. .notintop2:
  787.  asr.l #7,d0
  788.  sub.w #120,d0
  789.  move.w d0,4(a0)
  790.  
  791.  move.b damagetaken(a0),d2
  792.  asr.b #4,d2
  793.  beq .noscream2
  794.  
  795.  sub.b d2,numlives(a0)
  796.  bgt.s .notdeadyet2
  797.  
  798.  movem.l d0-d7/a0-a6,-(a7)
  799.  sub.l ObjectPoints,a1
  800.  add.l #ObjRotated,a1
  801.  move.l (a1),Noisex
  802.  move.w #400,Noisevol
  803.  move.w #15,Samplenum
  804.  move.b #1,chanpick
  805.  clr.b notifplaying
  806.  st backbeat
  807.  move.b 1(a0),IDNUM
  808.  jsr MakeSomeNoise
  809.  
  810.  move.w #400,d0
  811.  bsr ComputeBlast
  812.  
  813.  movem.l (a7)+,d0-d7/a0-a6
  814.  
  815.  move.b #4,16(a0)
  816.  move.b #%1000,17(a0)
  817.  move.l #$50003,8(a0)
  818.  move.w #$2020,6(a0)
  819.  move.w #$1010,14(a0)
  820.  
  821.  rts 
  822.  
  823. .notdeadyet2:
  824.  clr.b damagetaken(a0)
  825.  
  826.  movem.l d0-d7/a0-a6,-(a7)
  827.  move.l (a6),Noisex
  828.  move.w #200,Noisevol
  829.  move.w #8,Samplenum
  830.  move.b #1,chanpick
  831.  clr.b notifplaying
  832.  st backbeat
  833.  move.b 1(a0),IDNUM
  834.  jsr MakeSomeNoise
  835.  movem.l (a7)+,d0-d7/a0-a6
  836.  
  837.  bra .cantshoot
  838.  
  839. .noscream2:
  840.  
  841.  tst.b canshootgun
  842.  beq .cantshoot
  843.  
  844.  cmp.w #20,FourthTimer(a0)
  845.  bge .cantshoot
  846.  
  847.  move.w #50,FourthTimer(a0)
  848.  
  849.  move.w ThirdTimer(a0),d0
  850.  sub.w #1,d0
  851.  cmp.w #-2,d0
  852.  bge.s .noreset
  853.  
  854.  jsr GetRand
  855.  and.w #127,d0
  856.  add.w #100,d0
  857.  
  858. .noreset:
  859.  move.w d0,ThirdTimer(a0)
  860.  
  861.  move.w #9,Samplenum
  862.  move.b #4,SHOTTYPE
  863.  move.b #10,SHOTPOWER
  864.  move.w #16,SHOTSPEED
  865.  move.w #3,SHOTSHIFT
  866.  move.w #0,SHOTOFFMULT
  867.  move.l #0*128,SHOTYOFF
  868.  move.w #-100,2(a0)
  869.  
  870.  jsr FireAtPlayer2
  871.  
  872. .cantshoot:
  873.   
  874.  move.b #0,17(a0)
  875.  
  876.  move.l PLR1_Roompt,ToRoom
  877.  move.l objroom,FromRoom
  878.  move.w newx,Viewerx
  879.  move.w newz,Viewerz
  880.  move.w p1_xoff,Targetx
  881.  move.w p1_zoff,Targetz
  882.  move.b ObjInTop(a0),ViewerTop
  883.  move.b PLR1_StoodInTop,TargetTop
  884.  move.w Facing(a0),Facedir
  885.  move.l p1_yoff,d0
  886.  asr.l #7,d0
  887.  move.w d0,Targety
  888.  
  889.  move.w 4(a0),Viewery
  890.  
  891.  jsr CanItBeSeen
  892.  
  893.  tst.b CanSee
  894.  beq .carryonattack
  895.  
  896.  move.b #1,17(a0)
  897.  
  898. .carryonattack:
  899.  
  900.  move.l PLR2_Roompt,ToRoom
  901.  move.l objroom,FromRoom
  902.  move.w newx,Viewerx
  903.  move.w newz,Viewerz
  904.  move.w p2_xoff,Targetx
  905.  move.w p2_zoff,Targetz
  906.  move.b ObjInTop(a0),ViewerTop
  907.  move.b PLR2_StoodInTop,TargetTop
  908.  move.w Facing(a0),Facedir
  909.  move.l p2_yoff,d0
  910.  asr.l #7,d0
  911.  move.w d0,Targety
  912.  
  913.  move.w 4(a0),Viewery
  914.  
  915.  jsr CanItBeSeen
  916.  
  917.  tst.b CanSee
  918.  beq .carryonattack2
  919.  
  920.  or.b #2,17(a0)
  921.  
  922. .carryonattack2:
  923.  move.w Facing(a0),d0
  924.  add.w #2048,d0
  925.  and.w #8190,d0
  926.  move.w d0,Facing(a0)
  927.  
  928.  rts
  929.  
  930.  
  931. canshootgun: dc.w 0